package com.huangpeng.designmodel.highConcurrency;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author huangpeng
 * @Title 什么是CAS（compareAndSet()比较并交换）?
 * @Package
 * @Date 2021/1/28 11:04
 * @Description Unsafe类是CAS的核心类，由于Java方法无法直接访问底层系统，需要通过本地（native）方法来访问，Unsafe相当于一个后门，
 * 基于该类可以直接操作特定内存的数据，Unsafe类存在于 jdk.internal.misc包中，(Unsafe中jdk8在sun.misc包中)，其内部方法操作可以向C一样直接操作内存，
 * 因为Java中CAS操作的执行依赖于Unsafe类的方法。  注意Unsafe类中的所有方法都是native修饰的，也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应的任务。
 * 调用Unsafe类中的CAS方法，JVM会帮我们实现出CAS汇编指令，这是一种完全依赖于硬件的功能，通过它实现了原子操作，再次强调，由于CAS是一种系统原语，原语属于操作系统用语范畴，
 * 是由若干条指令组成的，用于完成某个功能的一个过程，并且原语的执行必须是连续的，在执行过程中不允许被中断，也就是说CAS是一条CPU的原子指令，不会造成所谓的数据不一致问题。
 * CAS有3个操作数，内存值V，旧的预期值A，要修改的更新至B，当且仅当预期值A和内存值V相等时，将内存值V修改成B，否则什么都不做。
 * CAS引发的缺点：
 * 循环时间长开销大：如果CAS失败，会一直进行尝试，如果CAS长时间一直不成功，可能会给CPU带来很大的开销。
 * 能保证一个共享变量的原子操作。
 * 引发出来ABA问题
 * @Version 1.0
 */
public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println("********************原值:" + atomicInteger.get());
        boolean A = atomicInteger.compareAndSet(5,2020);
        System.out.println("修改状态:" + A +"********************当前值:" + atomicInteger.get());
        boolean B = atomicInteger.compareAndSet(5,2020);
        System.out.println("修改状态:" + B +"********************当前值:" + atomicInteger.get());

    }
}
